#!/usr/bin/env python
# coding: utf-8

# In[6]:


import json, re

# 以周董所有歌曲之和为一个单位，采取分词。保存歌词（对可能还存在重复的live歌曲清除）(其中没有歌词的歌曲：专辑 黄俊郎的黑 为钢琴曲)
with open(r'lyriclist.json', 'r', encoding='utf8') as f:
    lyric = json.load(f)
c = 0
print(len(lyric))
title = set() # 去重集合
for i,ly in enumerate(lyric): # 歌曲列表
    a = ''
    cc = False
    if ly['data']['lrclist']==None: # 有的歌曲没有内容
        c+=1
        continue
    for i2,line in enumerate(ly['data']['lrclist']): # 歌词列表
        if i2==0: # 去重
            t = re.findall(r'(\S+)\(Live\)|(\S+)-', line['lineLyric'].replace(' ',''))
            if t==[]:
                t = ly['data']['songinfo']['songName'] # 对于第一行不是歌名的曲子,从属性中提取
            for tt in t[0]:
                if tt !='' and tt not in title:
                    title.add(tt) # 歌曲名
                    cc = True
        if cc:
            a+=(line['lineLyric'] + '。') # 拼截歌词
        else:
            break
    with open(r'zjl.txt', 'a+', encoding='utf8') as f:
        f.write(a)
        f.write('\n\n')
print('共:', i+1, '无歌词:', c)


# In[7]:


print(len(title), title)  # 共以下 182 首歌曲歌词
# 检查集合中是否有重复
z = {}
for i in title:
    if i == 1:
        continue
    z[i[:2]] = i       


# In[8]:


# 更换计数方法,已每首歌为单位词汇出现一次，计为1 保存歌词
import jieba
with open(r'lyriclist.json', 'r', encoding='utf8') as f:
    lyric = json.load(f)
c = 0
az = {}
print(len(lyric))
title= set() # 去重集合
for i, ly in enumerate(lyric): # 歌曲列表
    a = ''
    az2 = {}
    cc = False
    if ly['data']['lrclist']==None: # 有的歌曲没有内容
        c+=1
        continue
    for i2,line in enumerate(ly['data']['lrclist']): # 歌词列表
        if i2==0: # 去重
            t = re.findall(r'(\S+)\(Live\)|(\S+)-', line['lineLyric'].replace(' ',''))
            if t==[]:
                t = ly['data']['songinfo']['songName'] # 对于第一行不是歌名的曲子,从属性中提取
            for tt in t[0]:
                if tt !='' and tt not in title:
                    title.add(tt) # 歌曲名
                    cc = True
        if cc:
            a+=(line['lineLyric'] + '。') # 拼截歌词
        else:
            break
    seg_list = jieba.cut(a, cut_all=False)
    for s in seg_list:  # 精确模式
        az2[s] = az2.get(s,0)+ 1
    for s in az2:
        if s in {'。', ' ', '的', '我', '-', '周杰伦', '：', '在', '你', '词', '曲', '(', ')', '了', '是', '不', 'Jay', 'Chou', '着', '都', '说', '就', '有', '方文山', '那', '让','却', '很', '这', '编曲', '再', '会', '也', '谁', '要', '对', '还', '没有', '上', '我们', '人', '像', '走', '去', '被', '给', '里', '只', '跟', '没', '怎么', '来', '到', '等', '什么', '看', '而', '好', '又','将', '为', '可以', '才', '把', '他', '听', '过', '用', '已', '多', '能', '一起', '一直', '不是', '它', '自己',  '一个', '如果', '已经', '不会', '太', '不要', '因为', '还是', '只是','但', '叫', '不到', '中', '和', '当', '后', '真的', '想要', '请', '可', '不能', '我会','啊', '比', '林迈', '与', '找', '一点', '吧', '该','下','更', '别', '得', '我用','这样', '写', '一', '就是', '个', '《', '》','地','黄俊郎','（', '）','/','呢', '成','应该', '不过', '有些','是不是','不了','一种','有点', '她', '我要', '一样', '跟着','不用', '只有', '靠', '这么','还有', '拿', '为了','制作','一定', '从','连','做','钟兴民','站', '一遍','只能','一句', '这里','掉', '比较', '那么','向', '无法','这个','啦', '如','吗', '有人', '也许','哪里','起来',}:
            continue
        az[s] = az.get(s, 0) + 1
print('共:', i+1, 'None:', c, '分词数：',len(az))


# In[24]:


# 分词调整
fc = sorted(az.items(), key=lambda item:item[1], reverse=True)
a = [(i[0],i[1]) for i in fc[:300]]
print(a)


# In[26]:


# 词云，以每首歌为单位
import jieba.analyse
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

b = {}
for i,j in a:
    b[i] = j

# wordcloud 部分设置
font_path = r'../zhaozi.ttf' # 字体 # wordcloud设置
back_coloring = np.array(Image.open(r'z.png').convert('L'))  # 设置背景图片


# 设置词云属性
wc = WordCloud(font_path=font_path,  # 设置字体
               background_color="white",  # 背景颜色
               max_words=2000,  # 词云显示的最大词数
               mask=back_coloring,  # 设置背景图片
#                contour_width=1, # 描边
               contour_color='green'
               )
# 根据频率生成词云
wc.generate_from_frequencies(b)
wc.to_file(r'words.png') # 保存文件
# 显示图片
plt.figure()
plt.imshow(wc)
plt.axis("off")

plt.show()


# In[28]:


# 高频词汇分布
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import pickle

#显示图形
get_ipython().run_line_magic('matplotlib', 'inline')
# 设置matplotlib正常显示中文和负号
matplotlib.rcParams['font.sans-serif']=['SimHei']   # 用黑体显示中文
# matplotlib.rcParams['font.sans-serif']=['Songti SC']   # Mac
matplotlib.rcParams['axes.unicode_minus']=False     # 正常显示负号
matplotlib.rcParams['figure.figsize'] = (22.0, 12.0) # 设置figure_size尺寸

x,y = [],[]
a = a[:10]
for a1 in a:
    x.append(a1[0])
    y.append(a1[1])
    
rects = plt.bar(range(len(y)), y, width=0.8, fc='g') # 条形图

plt.xticks(range(len(x)), x, fontsize=15)
plt.xlabel("词汇",fontsize=15)
plt.ylabel("出现频率", fontsize=15)
plt.title("周杰伦歌词出现词频前10",fontsize=16)

plt.savefig(r'rank.png', dpi=300) #指定分辨率保存
plt.show()

